package framework.forms;

import junit.framework.Assert;

import org.openqa.selenium.By;

import framework.elements.ComboBox;
import framework.elements.Label;
import framework.elements.Link;
import framework.elements.TextBox;
import framework.forms.LoginForm.LOGIN_ITEMS;
//import test.java.framework.forms.reestrforms.RNPForm;
//import test.java.framework.forms.reestrforms.ReestrNedobroPostForm;
//import test.java.framework.forms.reestrforms.ReestrOtchetnostiODogovorahForm;
//import test.java.framework.forms.reestrforms.ReestrPlanovZakupokForm;
//import test.java.framework.forms.reestrforms.ReestrPolozheniyoZakupkahForm;
//import test.java.framework.forms.reestrforms.ReestrZakupokForm;
//import test.java.framework.forms.reestrforms.ReestrZhalobForm;

/** Базовый класс для форм с левым навигационным меню
 */
public class BaseFormWithLeftSlideBar extends BaseFormWithTopMenu{

	/** Базовый конструктор.
	 * @param titleLocator ожидаемый элемент на форме
	 * @param title название формы
	 */
	protected BaseFormWithLeftSlideBar(By titleLocator, String title) {
		super(titleLocator, title);
	}

	private String leftMenuItemTemplate = "//div[@id='sidebar-left']//div[@class='block']//li//a[contains(.,'%s')]";
	private final Label unicalName = new Label(By.xpath("//div[@class='maintab']//div[@class='paging'][contains(.,'Всего найдено')]/span[contains(.,'1')]"), "Запись 'Всего найдено 1'");

	//�?нформация о пользователе
	private String userInfoTemplate = "//div[@id='sidebar-left']//div[@class='content']//li[contains(.,'%s')]";
	private Label fio = new Label(By.xpath(String.format(userInfoTemplate, "Ф.�?.О.") + "/a"), "Ф.�?.О.");
	private Label role = new Label(By.xpath(String.format(userInfoTemplate, "Роль")), "Роль");
	private Label organizationName = new Label(By.xpath(String.format(userInfoTemplate, "Организация") + "/a"), "Организация");
	private Label polnomoch = new Label(By.xpath(String.format(userInfoTemplate, "Полномочия организации")), "Полномочия организации");
	private Label inn = new Label(By.xpath(String.format(userInfoTemplate, "�?НН")), "инн");
	private Label kpp = new Label(By.xpath(String.format(userInfoTemplate, "КПП")), "КПП");
	private Link regData = new Link(By.xpath("//div[@id='sidebar-left']//div[@id='block-1']//div//ul//li[contains(.,'Ф.�?.О.')]//a"), "Открыть регистрационные данные(клик по Ф.�?.О.)");
	private Link regOrgData = new Link(By.xpath("//div[@id='sidebar-left']//div[@id='block-1']//div//ul//li[contains(.,'Организация')]//a"), "Открыть регистрационные данные(клик по названию организации)");
	private Label expRegDataLoc = new Label(By.xpath("//h2[contains(.,'Регистрационные данные пользователя')]"), "Регистрационные данные пользователя");
	private ComboBox timezoneCmb = new ComboBox(By.id("timeZone"), "Часовой пояс");

	/** Возвращает элемент Label для запись "Найдено всего 1".
	 * 	Обычно нужен для ожидания выполнения поиска на странице.
	 * @return элемент Label для запись "Найдено всего 1"
	 */
	protected Label unicalName(){
		return unicalName;
	}

	/** Перечисление, содержащее список ссылок на левой боковой панели
	 */
	public enum LEFT_MENU_LINKS{
		REEST_PLANOV_ZAKUPOK("Реестр планов закупок"), UPRAVLENIE_POLSOVATELYAMI_ORG("Управление пользователями организации"), REESTR_POLOZHENIY_O_ZAK("Реестр положений о закупках"), REESTR_ZAKUPOK("Реестр закупок"),
		SVYAZI_ORGANIZACII("Связи организации"), REESTR_OTCHETNOSTI_O_DOGOVORAH("Реестр отчетности по договорам"), UPRAVLENIE_NSI("Управление НС�?"),REESTR_ZHALOB("Реестр жалоб"),REESTR_ZAYAVOK_RNP("Список заявок РНП"),
		REESTR_NEDOBROSOVEST_POST("Реестр недобросовестных поставщиков"), PROTOCOL_TYPES("Типы протоколов"), SPOSOBY_ZAKUPOK("Способы закупок");

		private String	val;

		/** Присваивает значение элементу перечисления
		 * @param name значение
		 */
		LEFT_MENU_LINKS(String name) {
			val = name;
		}

		@Override
		public String toString() {
			return val;
		}
	}

	/** Перечисление полей данных о пользователе
	 */
	public enum USER_DATA{
		FIO("Ф.�?.О."), ROLE("Роль"), ORGANIZATION("Организация"), POLNOMOCHIA_ORG("Полномочия организации"), INN("�?НН"), KPP("КПП");

		private String	val;

		/** Присваивает значение  элементу перечисления
		 * @param name значение
		 */
		USER_DATA(String name) {
			val = name;
		}

		@Override
		public String toString() {
			return val;
		}
	}

	/**
	 * Производит навигацию по левому меню
	 * @param item пункт меню
	 * @return реестр, в зависимости от выбранного пункта
	 */
	public BaseFormWithLeftSlideBar navigateToLeftItem(LEFT_MENU_LINKS item){
		//Временная заглушка
		TextBox uName = new TextBox(By.name("reg_login"), "Логин пользователя");
		browser.sleep(Integer.parseInt("2000"));
		Link l = new Link(By.xpath(String.format(leftMenuItemTemplate, item.toString())),item.toString());
		l.jsClick();
		browser.waitForPageToLoad();
		if(uName.isPresent()){
			SimulatorLoginForm slForm = new SimulatorLoginForm();
			slForm.login(LoginForm.getLoginData(LOGIN_ITEMS.SNILS), System.getProperty("password"));
			browser.waitForPageToLoad();
		}
		switch(item){
		/*	case REEST_PLANOV_ZAKUPOK:
				return new ReestrPlanovZakupokForm();
			case UPRAVLENIE_POLSOVATELYAMI_ORG:
				return new PolsovateliOrganizaciiForm();
			case REESTR_POLOZHENIY_O_ZAK:
				return new ReestrPolozheniyoZakupkahForm();
			case REESTR_ZAKUPOK:
				return new ReestrZakupokForm();
			case SVYAZI_ORGANIZACII:
				return new SvyaziOrganizaciiForm();
			case REESTR_OTCHETNOSTI_O_DOGOVORAH:
				return new ReestrOtchetnostiODogovorahForm();
			case UPRAVLENIE_NSI:
				return new SpisokSpravochnikovForm();
			case REESTR_ZHALOB:
				return new ReestrZhalobForm();
			case REESTR_ZAYAVOK_RNP:
				return new RNPForm();
			case REESTR_NEDOBROSOVEST_POST:
				return new ReestrNedobroPostForm();
			case SPOSOBY_ZAKUPOK:
				return new SposobyZakupokForm();
			case PROTOCOL_TYPES:
				return new ProtocolTypesForm();*/
			default:
				return new MyCabinetForm();
		}
	}

	/**
	 * Возврщает данные о пользователе, которые отображаются вверху левого навигационного меню
	 * @param item поле, из которого получаем текст
	 * @return текст в поле
	 */
	public String getUserDataFromLeftMenu(USER_DATA item){
		String text = null;
		switch(item){
			case FIO:
				text = fio.getText();
				break;
			case ROLE:
				text = role.getText();
				break;
			case ORGANIZATION:
				text = organizationName.getText();
				break;
			case POLNOMOCHIA_ORG:
				text = polnomoch.getText();
				break;
			case INN:
				text = inn.getText();
				break;
			case KPP:
				text = kpp.getText();
				break;
		default:
			break;
		}
		int index = text.indexOf(": ");
		logger.info("Поле " + item.toString() + " содержит текст: " + text.substring(index + 1));
		return text.substring(index + 1);
	}

	/**
	 * Открывает страницу с данными о текущем пользователе
	 * @return страница с данными о текущем пользователе
	 */
	public UserRegistrationDataForm openRegistrationUserInfo(){
		regData.jsClick();
		browser.waitForPageToLoad();
		expRegDataLoc.waitAndAssertIsPresent();
		return new UserRegistrationDataForm();
	}

	/** Проверяет данные о пользователе, отображаемые в левом навигационном меню
	 * @param expected ожидаемый результат
	 * @param data проверяемое поле
	 */
	public void assertUserData(String expected, USER_DATA data){
		String actual = getUserDataFromLeftMenu(data);
		if(data.equals(USER_DATA.INN) || data.equals(USER_DATA.KPP)) {
			actual = actual.replace(" ", "");
		}
		Assert.assertEquals(data.toString() + " пользователя содержит некорректное значение.",expected, actual);
		logger.info(data.toString() + " пользователя содержит корректное значение: " + expected);
	}

	/**
	 * Открывает форму просмотра сведений об организации
	 * @return форма просмотра сведений об организации
	 */
	public ProsmotrSvedeniyObOrganizaciiFrom openOrgData(){
		regOrgData.clickAndWaitForNewWindow();
		return new ProsmotrSvedeniyObOrganizaciiFrom();
	}

	/** Закрывает окно просмотра сведений об организации
	 */
	public void closeOrgInfoForm(){
		browser.closeWindowAndSwitch();
	}

	/**
	 * Проверяет значение часового пояса
	 * @param timeZone значение часовой зоны
	 */
	public void assertTimeZone(String timeZone){
		Assert.assertEquals("Часовой пояс не содержит некорректное значение", timeZone, timezoneCmb.getSelectedText());
		logger.info("Часовой пояс не содержит корректное значение: " + timeZone);
	}
}
